import router from '@/router'

import pinia from '@/stores'
import useCenterStore from '@/stores/center'
import { ElMessage } from 'element-plus'

const userInfoStore = useCenterStore(pinia)


// 不用进行token检查的白名单路径数组
const whiteList = ['/login','/register']

// 路由加载前
router.beforeEach(async (to, from, next) => {

  const token = userInfoStore.token;
  // 如果token存在(已经登陆或前面登陆过)
  if (token) {
    // 如果请求的是登陆路由
    if (to.path === '/login') {
      // 直接跳转到根路由, 并完成进度条
      next({ path: '/' })

    } else { // 请求的不是登陆路由
      // 是否已经登陆
      const hasLogin = !!userInfoStore.userInfo;
      // 如果已经登陆直接放行
      if (hasLogin) {
        next()
      } else { // 如果还没有登陆
        try {
          // 异步请求获取用户信息(包含权限数据) ==> 动态注册用户的权限路由 => 当次跳转不可见
          await userInfoStore.getUserInfo()
          next(to) // 重新跳转去目标路由, 能看到动态添加的异步路由, 且不会丢失参数  

        } catch (error: any) { // 如果请求处理过程中出错
          // 重置用户信息
          //当获取用户信息时，没有携带token会导致获取请求失败，进入catch，清除token，所以看起来的效果像是token 没有保存到本地
          // await userInfoStore.reset()
          // 提示错误信息
          // ElMessage.error(error.message || 'Has Error') // axios拦截器中已经有提示了
          // 跳转到登陆页面, 并携带原本要跳转的路由路径, 用于登陆成功后跳转
          // next(`/login?redirect=${to.path}`)
          userInfoStore.userInfo = {};
          userInfoStore.token = "";
          localStorage.removeItem('token')
        }
      }
    }
  } else { // 没有token
    // 如果目标路径在白名单中(是不需要token的路径)
    if (whiteList.indexOf(to.path) !== -1) {
      // 放行
      next()
    } else {
      // 如果没在白名单中, 跳转到登陆路由携带原目标路径
      next(`/login`)

    }
  }
})

// 路由加载后
router.afterEach(() => {

})
